4 // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
6 // The use and distribution terms for this software are contained in the file
7 // named license.txt, which can be found in the root of this distribution.
8 // By using this software in any fashion, you are agreeing to be bound by the
9 // terms of this license.
11 // You must not remove this notice, or any other, from this software.
16 namespace Microsoft
.JScript
{
18 using Microsoft
.JScript
.Vsa
;
20 using System
.Reflection
;
21 using System
.Collections
;
23 public sealed class LenientGlobalObject
: GlobalObject
{
25 public new Object Infinity
;
26 private Object MathField
;
27 public new Object NaN
;
28 public new Object undefined
;
29 // backing fields for constructor properties
30 private Object ActiveXObjectField
;
31 private Object ArrayField
;
32 private Object BooleanField
;
33 private Object DateField
;
34 private Object EnumeratorField
;
35 private Object ErrorField
;
36 private Object EvalErrorField
;
37 private Object FunctionField
;
38 private Object NumberField
;
39 private Object ObjectField
;
40 private Object RangeErrorField
;
41 private Object ReferenceErrorField
;
42 private Object RegExpField
;
43 private Object StringField
;
44 private Object SyntaxErrorField
;
45 private Object TypeErrorField
;
46 private Object VBArrayField
;
47 private Object URIErrorField
;
49 // function properties
50 public new Object decodeURI
;
51 public new Object decodeURIComponent
;
52 public new Object encodeURI
;
53 public new Object encodeURIComponent
;
54 [NotRecommended ("escape")]
55 public new Object escape
;
56 public new Object eval
;
57 public new Object isNaN
;
58 public new Object isFinite
;
59 public new Object parseInt
;
60 public new Object parseFloat
;
61 public new Object GetObject
;
62 public new Object ScriptEngine
;
63 public new Object ScriptEngineBuildVersion
;
64 public new Object ScriptEngineMajorVersion
;
65 public new Object ScriptEngineMinorVersion
;
66 [NotRecommended ("unescape")]
67 public new Object unescape
;
69 public new Object boolean
;
70 public new Object
@byte;
71 public new Object
@char;
72 public new Object
@decimal;
73 public new Object
@double;
74 public new Object
@float;
75 public new Object
@int;
76 public new Object
@long;
77 public new Object
@sbyte;
78 public new Object
@short;
79 public new Object
@void;
80 public new Object
@uint;
81 public new Object
@ulong;
82 public new Object
@ushort;
84 //backing fields for private properties used to initialize orignalXXX properties
85 private LenientArrayPrototype arrayPrototypeField
;
86 private LenientFunctionPrototype functionPrototypeField
;
87 private LenientObjectPrototype objectPrototypeField
;
88 private VsaEngine engine
;
90 internal LenientGlobalObject(VsaEngine engine
){
93 this.Infinity
= Double
.PositiveInfinity
;
94 this.NaN
= Double
.NaN
;
95 this.undefined
= null;
97 this.ActiveXObjectField
= Missing
.Value
;
98 this.ArrayField
= Missing
.Value
;
99 this.BooleanField
= Missing
.Value
;
100 this.DateField
= Missing
.Value
;
101 this.EnumeratorField
= Missing
.Value
;
102 this.ErrorField
= Missing
.Value
;
103 this.EvalErrorField
= Missing
.Value
;
104 this.FunctionField
= Missing
.Value
;
105 this.MathField
= Missing
.Value
;
106 this.NumberField
= Missing
.Value
;
107 this.ObjectField
= Missing
.Value
;
108 this.RangeErrorField
= Missing
.Value
;
109 this.ReferenceErrorField
= Missing
.Value
;
110 this.RegExpField
= Missing
.Value
;
111 this.StringField
= Missing
.Value
;
112 this.SyntaxErrorField
= Missing
.Value
;
113 this.TypeErrorField
= Missing
.Value
;
114 this.VBArrayField
= Missing
.Value
;
115 this.URIErrorField
= Missing
.Value
;
117 Type super
= typeof(GlobalObject
);
118 LenientFunctionPrototype fprot
= this.functionPrototype
;
119 this.decodeURI
= new BuiltinFunction("decodeURI", this, super
.GetMethod("decodeURI"), fprot
);
120 this.decodeURIComponent
= new BuiltinFunction("decodeURIComponent", this, super
.GetMethod("decodeURIComponent"), fprot
);
121 this.encodeURI
= new BuiltinFunction("encodeURI", this, super
.GetMethod("encodeURI"), fprot
);
122 this.encodeURIComponent
= new BuiltinFunction("encodeURIComponent", this, super
.GetMethod("encodeURIComponent"), fprot
);
123 this.escape
= new BuiltinFunction("escape", this, super
.GetMethod("escape"), fprot
);
124 this.eval
= new BuiltinFunction("eval", this, super
.GetMethod("eval"), fprot
);
125 this.isNaN
= new BuiltinFunction("isNaN", this, super
.GetMethod("isNaN"), fprot
);
126 this.isFinite
= new BuiltinFunction("isFinite", this, super
.GetMethod("isFinite"), fprot
);
127 this.parseInt
= new BuiltinFunction("parseInt", this, super
.GetMethod("parseInt"), fprot
);
128 this.GetObject
= new BuiltinFunction("GetObject", this, super
.GetMethod("GetObject"), fprot
);
129 this.parseFloat
= new BuiltinFunction("parseFloat", this, super
.GetMethod("parseFloat"), fprot
);
130 this.ScriptEngine
= new BuiltinFunction("ScriptEngine", this, super
.GetMethod("ScriptEngine"), fprot
);
131 this.ScriptEngineBuildVersion
= new BuiltinFunction("ScriptEngineBuildVersion", this, super
.GetMethod("ScriptEngineBuildVersion"), fprot
);
132 this.ScriptEngineMajorVersion
= new BuiltinFunction("ScriptEngineMajorVersion", this, super
.GetMethod("ScriptEngineMajorVersion"), fprot
);
133 this.ScriptEngineMinorVersion
= new BuiltinFunction("ScriptEngineMinorVersion", this, super
.GetMethod("ScriptEngineMinorVersion"), fprot
);
134 this.unescape
= new BuiltinFunction("unescape", this, super
.GetMethod("unescape"), fprot
);
136 this.boolean
= Typeob
.Boolean
;
137 this.@byte = Typeob
.Byte
;
138 this.@char = Typeob
.Char
;
139 this.@decimal = Typeob
.Decimal
;
140 this.@double = Typeob
.Double
;
141 this.@float = Typeob
.Single
;
142 this.@int = Typeob
.Int32
;
143 this.@long = Typeob
.Int64
;
144 this.@sbyte = Typeob
.SByte
;
145 this.@short = Typeob
.Int16
;
146 this.@void = Typeob
.Void
;
147 this.@uint = Typeob
.UInt32
;
148 this.@ulong = Typeob
.UInt64
;
149 this.@ushort = Typeob
.UInt16
;
152 private LenientArrayPrototype arrayPrototype
{
154 if (this.arrayPrototypeField
== null)
155 this.arrayPrototypeField
= new LenientArrayPrototype(this.functionPrototype
, this.objectPrototype
);
156 return this.arrayPrototypeField
;
160 private LenientFunctionPrototype functionPrototype
{
162 if (this.functionPrototypeField
== null){
163 Object junk
= this.objectPrototype
; //initialize functionPrototypeField indiretly because of circularity
165 return this.functionPrototypeField
;
169 private LenientObjectPrototype objectPrototype
{
171 if (this.objectPrototypeField
== null){
172 LenientObjectPrototype prototype
= this.objectPrototypeField
= new LenientObjectPrototype(this.engine
);
173 LenientFunctionPrototype fprot
= this.functionPrototypeField
= new LenientFunctionPrototype(prototype
);
174 prototype
.Initialize(fprot
);
175 JSObject prot
= new JSObject(prototype
, false);
176 prot
.AddField("constructor").SetValue(prot
, fprot
);
179 return this.objectPrototypeField
;
183 internal override ActiveXObjectConstructor originalActiveXObject
{
185 if (this.originalActiveXObjectField
== null)
186 this.originalActiveXObjectField
= new ActiveXObjectConstructor(this.functionPrototype
);
187 return this.originalActiveXObjectField
;
191 internal override ArrayConstructor originalArray
{
193 if (this.originalArrayField
== null)
194 this.originalArrayField
= new ArrayConstructor(this.functionPrototype
, this.arrayPrototype
);
195 return this.originalArrayField
;
199 internal override BooleanConstructor originalBoolean
{
201 if (this.originalBooleanField
== null)
202 this.originalBooleanField
= new BooleanConstructor(this.functionPrototype
, new LenientBooleanPrototype(this.functionPrototype
, this.objectPrototype
));
203 return this.originalBooleanField
;
207 internal override DateConstructor originalDate
{
209 if (this.originalDateField
== null)
210 this.originalDateField
= new LenientDateConstructor(this.functionPrototype
, new LenientDatePrototype(this.functionPrototype
, this.objectPrototype
));
211 return this.originalDateField
;
215 internal override ErrorConstructor originalError
{
217 if (this.originalErrorField
== null)
218 this.originalErrorField
= new ErrorConstructor(this.functionPrototype
, new LenientErrorPrototype(this.functionPrototype
, this.objectPrototype
, "Error"), this);
219 return this.originalErrorField
;
223 internal override EnumeratorConstructor originalEnumerator
{
225 if (this.originalEnumeratorField
== null)
226 this.originalEnumeratorField
= new EnumeratorConstructor(this.functionPrototype
, new LenientEnumeratorPrototype(this.functionPrototype
, this.objectPrototype
));
227 return this.originalEnumeratorField
;
231 internal override ErrorConstructor originalEvalError
{
233 if (this.originalEvalErrorField
== null)
234 this.originalEvalErrorField
= new ErrorConstructor("EvalError", ErrorType
.EvalError
, this.originalError
, this);
235 return this.originalEvalErrorField
;
239 internal override FunctionConstructor originalFunction
{
241 if (this.originalFunctionField
== null)
242 this.originalFunctionField
= new FunctionConstructor(this.functionPrototype
);
243 return this.originalFunctionField
;
247 internal override NumberConstructor originalNumber
{
249 if (this.originalNumberField
== null)
250 this.originalNumberField
= new NumberConstructor(this.functionPrototype
, new LenientNumberPrototype(this.functionPrototype
, this.objectPrototype
));
251 return this.originalNumberField
;
255 internal override ObjectConstructor originalObject
{
257 if (this.originalObjectField
== null)
258 this.originalObjectField
= new ObjectConstructor(this.functionPrototype
, this.objectPrototype
);
259 return this.originalObjectField
;
263 internal override ObjectPrototype originalObjectPrototype
{
265 if (this.originalObjectPrototypeField
== null)
266 this.originalObjectPrototypeField
= ObjectPrototype
.ob
;
267 return this.originalObjectPrototypeField
;
271 internal override ErrorConstructor originalRangeError
{
273 if (this.originalRangeErrorField
== null)
274 this.originalRangeErrorField
= new ErrorConstructor("RangeError", ErrorType
.RangeError
, this.originalError
, this);
275 return this.originalRangeErrorField
;
279 internal override ErrorConstructor originalReferenceError
{
281 if (this.originalReferenceErrorField
== null)
282 this.originalReferenceErrorField
= new ErrorConstructor("ReferenceError", ErrorType
.ReferenceError
, this.originalError
, this);
283 return this.originalReferenceErrorField
;
287 internal override RegExpConstructor originalRegExp
{
289 if (this.originalRegExpField
== null)
290 this.originalRegExpField
= new RegExpConstructor(this.functionPrototype
, new LenientRegExpPrototype(this.functionPrototype
,
291 this.objectPrototype
), this.arrayPrototype
);
292 return this.originalRegExpField
;
296 internal override StringConstructor originalString
{
298 if (this.originalStringField
== null)
299 this.originalStringField
= new LenientStringConstructor(this.functionPrototype
,
300 new LenientStringPrototype(this.functionPrototype
, this.objectPrototype
));
301 return this.originalStringField
;
305 internal override ErrorConstructor originalSyntaxError
{
307 if (this.originalSyntaxErrorField
== null)
308 this.originalSyntaxErrorField
= new ErrorConstructor("SyntaxError", ErrorType
.SyntaxError
, this.originalError
, this);
309 return this.originalSyntaxErrorField
;
313 internal override ErrorConstructor originalTypeError
{
315 if (this.originalTypeErrorField
== null)
316 this.originalTypeErrorField
= new ErrorConstructor("TypeError", ErrorType
.TypeError
, this.originalError
, this);
317 return this.originalTypeErrorField
;
321 internal override ErrorConstructor originalURIError
{
323 if (this.originalURIErrorField
== null)
324 this.originalURIErrorField
= new ErrorConstructor("URIError", ErrorType
.URIError
, this.originalError
, this);
325 return this.originalURIErrorField
;
329 internal override VBArrayConstructor originalVBArray
{
331 if (this.originalVBArrayField
== null)
332 this.originalVBArrayField
= new VBArrayConstructor(this.functionPrototype
,
333 new LenientVBArrayPrototype(this.functionPrototype
, this.objectPrototype
));
334 return this.originalVBArrayField
;
338 new public Object ActiveXObject
{
340 if (this.ActiveXObjectField
is Missing
)
341 this.ActiveXObjectField
= this.originalActiveXObject
;
342 return this.ActiveXObjectField
;
345 this.ActiveXObjectField
= value;
349 new public Object Array
{
351 if (this.ArrayField
is Missing
)
352 this.ArrayField
= this.originalArray
;
353 return this.ArrayField
;
356 this.ArrayField
= value;
360 new public Object Boolean
{
362 if (this.BooleanField
is Missing
)
363 this.BooleanField
= this.originalBoolean
;
364 return this.BooleanField
;
367 this.BooleanField
= value;
371 new public Object Date
{
373 if (this.DateField
is Missing
)
374 this.DateField
= this.originalDate
;
375 return this.DateField
;
378 this.DateField
= value;
382 new public Object Enumerator
{
384 if (this.EnumeratorField
is Missing
)
385 this.EnumeratorField
= this.originalEnumerator
;
386 return this.EnumeratorField
;
389 this.EnumeratorField
= value;
393 new public Object Error
{
395 if (this.ErrorField
is Missing
)
396 this.ErrorField
= this.originalError
;
397 return this.ErrorField
;
400 this.ErrorField
= value;
404 new public Object EvalError
{
406 if (this.EvalErrorField
is Missing
)
407 this.EvalErrorField
= this.originalEvalError
;
408 return this.EvalErrorField
;
411 this.EvalErrorField
= value;
415 new public Object Function
{
417 if (this.FunctionField
is Missing
)
418 this.FunctionField
= this.originalFunction
;
419 return this.FunctionField
;
422 this.FunctionField
= value;
426 new public Object Math
{
428 if (this.MathField
is Missing
)
429 this.MathField
= new LenientMathObject(this.objectPrototype
, this.functionPrototype
);
430 return this.MathField
;
433 this.MathField
= value;
437 new public Object Number
{
439 if (this.NumberField
is Missing
)
440 this.NumberField
= this.originalNumber
;
441 return this.NumberField
;
444 this.NumberField
= value;
448 new public Object Object
{
450 if (this.ObjectField
is Missing
)
451 this.ObjectField
= this.originalObject
;
452 return this.ObjectField
;
455 this.ObjectField
= value;
459 new public Object RangeError
{
461 if (this.RangeErrorField
is Missing
)
462 this.RangeErrorField
= this.originalRangeError
;
463 return this.RangeErrorField
;
466 this.RangeErrorField
= value;
470 new public Object ReferenceError
{
472 if (this.ReferenceErrorField
is Missing
)
473 this.ReferenceErrorField
= this.originalReferenceError
;
474 return this.ReferenceErrorField
;
477 this.ReferenceErrorField
= value;
481 new public Object RegExp
{
483 if (this.RegExpField
is Missing
)
484 this.RegExpField
= this.originalRegExp
;
485 return this.RegExpField
;
488 this.RegExpField
= value;
492 new public Object String
{
494 if (this.StringField
is Missing
)
495 this.StringField
= this.originalString
;
496 return this.StringField
;
499 this.StringField
= value;
503 new public Object SyntaxError
{
505 if (this.SyntaxErrorField
is Missing
)
506 this.SyntaxErrorField
= this.originalSyntaxError
;
507 return this.SyntaxErrorField
;
510 this.SyntaxErrorField
= value;
514 new public Object TypeError
{
516 if (this.TypeErrorField
is Missing
)
517 this.TypeErrorField
= this.originalTypeError
;
518 return this.TypeErrorField
;
521 this.TypeErrorField
= value;
525 new public Object URIError
{
527 if (this.URIErrorField
is Missing
)
528 this.URIErrorField
= this.originalURIError
;
529 return this.URIErrorField
;
532 this.URIErrorField
= value;
536 new public Object VBArray
{
538 if (this.VBArrayField
is Missing
)
539 this.VBArrayField
= this.originalVBArray
;
540 return this.VBArrayField
;
543 this.VBArrayField
= value;